#include "nixie_tube_3.h"

nixie_tube_3_infor_t nt3_infor = {0};

void nixie_tube_3_init(void)
{
    /* clk 配置 */
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); // 使能时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOD, ENABLE);
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_IOMUX, ENABLE);
    GPIO_IOMUX_ChangePin(IOMUX_PIN11, IOMUX_PB5_SEL_PB5); // Configure SWCLK to PB5

    /* gpio 配置 */
    GPIO_InitStructure.GPIO_Pin = NT3_TUBE1_PIN | NT3_B_PIN | NT3_F_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = NT3_TUBE2_PIN | NT3_TUBE3_PIN | NT3_A_PIN | NT3_D_PIN | NT3_E_PIN;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = NT3_G_PIN;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = NT3_C_PIN | NT3_DP_PIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_WriteBit(GPIOA, NT3_C_PIN | NT3_DP_PIN, Bit_SET); // 默认高电平
    GPIO_WriteBit(GPIOB, NT3_G_PIN, Bit_SET);
    GPIO_WriteBit(GPIOC, NT3_TUBE1_PIN | NT3_B_PIN | NT3_F_PIN, Bit_SET);
    GPIO_WriteBit(GPIOD, NT3_TUBE2_PIN | NT3_TUBE3_PIN | NT3_A_PIN | NT3_D_PIN | NT3_E_PIN, Bit_SET);
}

/**
 * @brief  数码管数据更新
 * @param  value 刷新的数字
 * @return 无
 * @note   运行时基 - 15ms
 */
void nixie_tube_num_update(float value)
{
    if (value >= 1000)
    {
        nt3_infor.display_num = 999;
        nt3_infor.dp_digit = 1;
    }
    else if (value >= 100)
    {
        nt3_infor.display_num = value;
        nt3_infor.dp_digit = 1;
    }
    else if (value >= 10)
    {
        nt3_infor.display_num = value * 10;
        nt3_infor.dp_digit = 2;
    }
    else if (value >= 1)
    {
        nt3_infor.display_num = value * 100;
        nt3_infor.dp_digit = 3;
    }
    else if (value > 0)
    {
        nt3_infor.display_num = value * 1000;
        nt3_infor.dp_digit = 0;
    }
    else
    {
        nt3_infor.display_num = 0;
        nt3_infor.dp_digit = 0;
    }
}

/**
 * @brief  数码管数据刷新
 * @param  value 刷新的数字
 * @return 无
 * @note   运行时基 - 15ms
 */
void nixie_tube_num_refresh(void)
{
    static uint8_t num_digit = 0; // 0 - 百位; 1 - 十位; 2 - 个位;

    switch (num_digit)
    {
    case 0:
        /* 刷新百位 */
        NT_TUBE_TES(0);
        NT_TUBE_UNIT(0);
        nixie_tube_num_display(nt3_infor.display_num / 100 % 10); // 刷新数字
        if (nt3_infor.dp_digit == 3)                              // 刷新小数点
            NT_NUM_DP(1);
        else
            NT_NUM_DP(0);

        NT_TUBE_HUNDREDS(1);
        break;
    case 1:
        /* 刷新十位 */
        NT_TUBE_HUNDREDS(0);
        NT_TUBE_UNIT(0);
        nixie_tube_num_display(nt3_infor.display_num / 10 % 10); // 刷新数字
        if (nt3_infor.dp_digit == 2)                             // 刷新小数点
            NT_NUM_DP(1);
        else
            NT_NUM_DP(0);

        NT_TUBE_TES(1);
        break;
    case 2:
        /* 刷新百位 */
        NT_TUBE_HUNDREDS(0);
        NT_TUBE_TES(0);
        nixie_tube_num_display(nt3_infor.display_num % 10); // 刷新数字
        if (nt3_infor.dp_digit == 1)                        // 刷新小数点
            NT_NUM_DP(1);
        else
            NT_NUM_DP(0);

        NT_TUBE_UNIT(1);
        break;
    default:
        num_digit = 0;
        break;
    }

    if (num_digit++ >= 2)
        num_digit = 0;
}

/**
 * @brief  数码管数字显示
 * @param  num 显示的数字值（0 - 9）
 * @return 无
 */
void nixie_tube_num_display(uint8_t num)
{
    switch (num)
    {
    case 0:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(1);
        NT_NUM_E(1);
        NT_NUM_F(1);
        NT_NUM_G(0);
        break;
    case 1:
        NT_NUM_A(0);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(0);
        NT_NUM_E(0);
        NT_NUM_F(0);
        NT_NUM_G(0);
        break;
    case 2:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(0);
        NT_NUM_D(1);
        NT_NUM_E(1);
        NT_NUM_F(0);
        NT_NUM_G(1);
        break;
    case 3:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(1);
        NT_NUM_E(0);
        NT_NUM_F(0);
        NT_NUM_G(1);
        break;
    case 4:
        NT_NUM_A(0);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(0);
        NT_NUM_E(0);
        NT_NUM_F(1);
        NT_NUM_G(1);
        break;
    case 5:
        NT_NUM_A(1);
        NT_NUM_B(0);
        NT_NUM_C(1);
        NT_NUM_D(1);
        NT_NUM_E(0);
        NT_NUM_F(1);
        NT_NUM_G(1);
        break;
    case 6:
        NT_NUM_A(1);
        NT_NUM_B(0);
        NT_NUM_C(1);
        NT_NUM_D(1);
        NT_NUM_E(1);
        NT_NUM_F(1);
        NT_NUM_G(1);
        break;
    case 7:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(0);
        NT_NUM_E(0);
        NT_NUM_F(0);
        NT_NUM_G(0);
        break;
    case 8:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(1);
        NT_NUM_E(1);
        NT_NUM_F(1);
        NT_NUM_G(1);
        break;
    case 9:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(1);
        NT_NUM_D(1);
        NT_NUM_E(0);
        NT_NUM_F(1);
        NT_NUM_G(1);
        break;

    default:
        NT_NUM_A(1);
        NT_NUM_B(1);
        NT_NUM_C(0);
        NT_NUM_D(1);
        NT_NUM_E(1);
        NT_NUM_F(1);
        NT_NUM_G(1);
        break;
    }
}
